//
//  UITextView+Extension.swift
//  表情键盘
//
//  Created by 唐后能 on 16/4/27.
//  Copyright © 2016年 itheima. All rights reserved.
//

import UIKit

extension UITextView {
    
    /// 获取textView的属性文本(包括表情和普通文本)
    func emoticonText() -> String {
        var strM = ""
        /// 属性文本会分段保存.普通文本一段, emoji是一段, 附件是一段
        /// 获取属性文本中的每一段
        self.attributedText.enumerateAttributesInRange(NSRange(location: 0, length: self.attributedText.length), options: []) { (dict, range, _) -> Void in
            // 每当获取到一段内容就会调用闭包一次
            // 会返回每段的range
            // 图片表情 dict里面会包含 NSAttachment key, 获取图片表情的名称
            if let attachment = dict["NSAttachment"] as? TJTextAttachment {
                // 附件 chs
                strM += attachment.chs!
            } else {
                // 普通文本和emoji表情,直接截取获取对应的内容range
                let text = (self.attributedText.string as NSString).substringWithRange(range)
                
                // 将截取的文本拼接起来
                strM += text
            }
        }
        
        return strM
    }


    // 在textVeiw中插入表情图片.
      func insertEmotionToTextView(emotion:TJEmotion){
        
        // 1,点击的是emoji表情.-->添加text文本.
        if let emoji = emotion.emoji {
            
            self.insertText(emoji)
            return
        }
        
        // 2,点击的是图片或浪小花.-->添加属性文本.
        if let pic = emotion.fullPngPath {
            
//            // 将图片添加textView, textView可以显示属性文本
//            // 1.根据图片准备好附件.
//            // 创建附件,并将图片赋值给附件的image属性.
//            let attachment = TJTextAttachment()
//            attachment.image = UIImage(named: pic)
//            
//            // 将表情图片名称存入附件中.
//            attachment.chs = emotion.chs
//            
//            // 获取文本的高度
//            let height = self.font?.lineHeight ?? 10
//            
//            // 设置附件的大小
//            attachment.bounds = CGRect(x: 0, y: -4, width: height, height: height)
            
            // 2.根据附件创建属性文本
            //            let attrString = NSAttributedString(attachment: attachment) // 此方式,后面的插入的图片会变小.
            
            // 创建带表情图片的属性文本.
            let attrString = emotion.emotionModelToAttrString(font!) as! NSMutableAttributedString
            
            //// 创建带附件的属性文本,并且添加font属性-->如果没有添加font属性,在表情图片后面再插入的图片会变小.
//            let attrString = NSMutableAttributedString(attributedString: NSAttributedString(attachment: attachment))
            attrString.addAttribute(NSFontAttributeName, value: self.font!, range: NSRange(location: 0, length: 1))
            
            // 根据textView现有属性文本创建可变的属性文本.
            let attrStringM = NSMutableAttributedString(attributedString: (self.attributedText)!)
            
            // 记录光标位置.
            let selectedRange = self.selectedRange
            
            // 改变可变文本内容->将textView将要显示的文本把光标选中位置给替换.
            attrStringM.replaceCharactersInRange((self.selectedRange), withAttributedString: attrString)
            //
            // 3.textView设置属性文本
            self.attributedText = attrStringM
            
            // 重新设置光标位置
            self.selectedRange = NSRange(location: selectedRange.location + 1, length: 0)
            
            // 当textVeiw中输入表情图片后,系统不会发出textDidchanged的通知,需要自己发通知.
            NSNotificationCenter.defaultCenter().postNotificationName(UITextViewTextDidChangeNotification, object: self)
            delegate?.textViewDidChange?(self)
        }
        
    }

}
